package com.duckduckgo.mobile.android.fragment;
import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;
import android.support.v7.view.menu.MenuBuilder;
import android.util.Log;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.DownloadListener;
import android.webkit.WebView;
import com.duckduckgo.mobile.android.DDGApplication;
import com.duckduckgo.mobile.android.R;
import com.duckduckgo.mobile.android.actionbar.DDGActionBarManager;
import com.duckduckgo.mobile.android.activity.KeyboardService;
import com.duckduckgo.mobile.android.bus.BusProvider;
import com.duckduckgo.mobile.android.dialogs.menuDialogs.WebViewQueryMenuDialog;
import com.duckduckgo.mobile.android.dialogs.menuDialogs.WebViewStoryMenuDialog;
import com.duckduckgo.mobile.android.dialogs.menuDialogs.WebViewWebPageMenuDialog;
import com.duckduckgo.mobile.android.download.ContentDownloader;
import com.duckduckgo.mobile.android.events.HandleShareButtonClickEvent;
import com.duckduckgo.mobile.android.events.OrbotConnectedEvent;
import com.duckduckgo.mobile.android.events.OverflowButtonClickEvent;
import com.duckduckgo.mobile.android.events.ReadabilityFeedRetrieveSuccessEvent;
import com.duckduckgo.mobile.android.events.WebViewEvents.WebViewBackPressActionEvent;
import com.duckduckgo.mobile.android.events.WebViewEvents.WebViewClearBrowserStateEvent;
import com.duckduckgo.mobile.android.events.WebViewEvents.WebViewClearCacheEvent;
import com.duckduckgo.mobile.android.events.WebViewEvents.WebViewOnPageStarted;
import com.duckduckgo.mobile.android.events.WebViewEvents.WebViewUpdateMenuNavigationEvent;
import com.duckduckgo.mobile.android.events.WebViewEvents.WebViewItemMenuClickEvent;
import com.duckduckgo.mobile.android.events.WebViewEvents.WebViewOpenMenuEvent;
import com.duckduckgo.mobile.android.events.WebViewEvents.WebViewReloadActionEvent;
import com.duckduckgo.mobile.android.events.WebViewEvents.WebViewSearchOrGoToUrlEvent;
import com.duckduckgo.mobile.android.events.WebViewEvents.WebViewSearchWebTermEvent;
import com.duckduckgo.mobile.android.events.WebViewEvents.WebViewShowHistoryObjectEvent;
import com.duckduckgo.mobile.android.events.feedEvents.FeedItemSelectedEvent;
import com.duckduckgo.mobile.android.events.readabilityEvents.TurnReadabilityOffEvent;
import com.duckduckgo.mobile.android.events.readabilityEvents.TurnReadabilityOnEvent;
import com.duckduckgo.mobile.android.events.saveEvents.SaveSearchEvent;
import com.duckduckgo.mobile.android.events.saveEvents.SaveStoryEvent;
import com.duckduckgo.mobile.android.events.saveEvents.UnSaveSearchEvent;
import com.duckduckgo.mobile.android.events.saveEvents.UnSaveStoryEvent;
import com.duckduckgo.mobile.android.events.shareEvents.ShareFeedEvent;
import com.duckduckgo.mobile.android.events.shareEvents.ShareSearchEvent;
import com.duckduckgo.mobile.android.events.shareEvents.ShareWebPageEvent;
import com.duckduckgo.mobile.android.network.DDGNetworkConstants;
import com.duckduckgo.mobile.android.objects.FeedObject;
import com.duckduckgo.mobile.android.objects.history.HistoryObject;
import com.duckduckgo.mobile.android.tasks.ReadableFeedTask;
import com.duckduckgo.mobile.android.util.DDGConstants;
import com.duckduckgo.mobile.android.util.DDGControlVar;
import com.duckduckgo.mobile.android.util.DDGUtils;
import com.duckduckgo.mobile.android.util.PreferencesManager;
import com.duckduckgo.mobile.android.util.SESSIONTYPE;
import com.duckduckgo.mobile.android.util.URLTYPE;
import com.duckduckgo.mobile.android.views.DDGOverflowMenu;
import com.duckduckgo.mobile.android.views.webview.DDGWebChromeClient;
import com.duckduckgo.mobile.android.views.webview.DDGWebView;
import com.duckduckgo.mobile.android.views.webview.DDGWebViewClient;
import com.squareup.otto.Subscribe;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
public class WebFragment extends Fragment {
public static final String TAG = "web_fragment";
public static final String URL = "url";
public static final String SESSION_TYPE = "session_type";
private static final int ITEM_ID_SAVE_IMAGE = 0;
private static final int REQUEST_WRITE_EXTERNAL_STORAGE = 0;
private Context context = null;
private String mWebViewDefaultUA = null;
private DDGWebView mainWebView = null;
private ContentDownloader contentDownloader;
private KeyboardService keyboardService;
private View fragmentView;
private boolean savedState = false;
private URLTYPE urlType = URLTYPE.WEBPAGE;
private Menu webMenu = null;
private Menu headerMenu = null;
private Menu mainMenu = null;
private DDGOverflowMenu overflowMenu = null;
private ReadableFeedTask readableFeedTask;
public static WebFragment newInstance(String url, SESSIONTYPE sessionType) {
WebFragment fragment = new WebFragment();
Bundle args = new Bundle();
args.putString(URL, url);
args.putInt(SESSION_TYPE, sessionType.getCode());
fragment.setArguments(args);
return fragment;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
this.context = context;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if(savedInstanceState!=null) {
savedState = true;
}
fragmentView = inflater.inflate(R.layout.fragment_web, container, false);
return fragmentView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setRetainInstance(true);
context = getActivity();
init();
// Restore the state of the WebView
if(savedInstanceState!=null) {
mainWebView.restoreState(savedInstanceState);
urlType = URLTYPE.getByCode(savedInstanceState.getInt("url_type"));
}
if (isDownloadImagesSupported()) {
registerForContextMenu(mainWebView);
}
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
WebView.HitTestResult hitTestResult = mainWebView.getHitTestResult();
if (isDownloadImagesSupported() && isImage(hitTestResult)) {
menu.setHeaderTitle(hitTestResult.getExtra());
menu.add(0, ITEM_ID_SAVE_IMAGE, 0, R.string.save_image_context_menu_action);
}
}
@Override
public boolean onContextItemSelected(MenuItem item) {
if (item.getItemId() == ITEM_ID_SAVE_IMAGE && isDownloadImagesSupported()) {
if (hasWriteExternalStoragePermission()) {
scheduleImageDownload();
} else {
requestPermissions(new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE },
REQUEST_WRITE_EXTERNAL_STORAGE);
}
return true;
}
return super.onContextItemSelected(item);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == REQUEST_WRITE_EXTERNAL_STORAGE && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
scheduleImageDownload();
} else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
private void scheduleImageDownload() {
String imageUrl = mainWebView.getHitTestResult().getExtra();
contentDownloader.downloadImage(imageUrl);
}
private boolean hasWriteExternalStoragePermission() {
int permission = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE);
return permission == PackageManager.PERMISSION_GRANTED;
}
private boolean isImage(WebView.HitTestResult hitTestResult) {
int type = hitTestResult.getType();
return type == WebView.HitTestResult.IMAGE_TYPE || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE;
}
private boolean isDownloadImagesSupported() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD
&& contentDownloader.isDownloadManagerEnabled();
}
@Override
public void onStart() {
super.onStart();
BusProvider.getInstance().register(this);
DDGControlVar.mDuckDuckGoContainer.torIntegration.prepareTorSettings();
}
@Override
public void onResume() {
super.onResume();
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
mainWebView.onResume();
}
}
@Override
public void onPause() {
dismissMenu();
if(readableFeedTask!=null) {
readableFeedTask.cancel(true);
readableFeedTask = null;
}
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
mainWebView.onPause();
}
super.onPause();
}
@Override
public void onStop() {
BusProvider.getInstance().unregister(this);
super.onStop();
}
@Override
public void onDestroy() {
mainWebView.loadUrl(DDGWebView.ABOUT_BLANK);
mainWebView.stopView();
mainWebView.setWebViewClient(null);
mainWebView.setWebChromeClient(null);
mainWebView = null;
super.onDestroy();
}
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if(!hidden) {
DDGActionBarManager.getInstance().setSearchBarText(mainWebView.getUrl());
mainWebView.getSettings().setJavaScriptEnabled(PreferencesManager.getEnableJavascript());
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
dismissMenu();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("url_type", urlType.getCode());
// Save the state of the WebView
mainWebView.saveState(outState);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
headerMenu = new MenuBuilder(context);
inflater.inflate(R.menu.web_navigation, headerMenu);
inflater.inflate(R.menu.feed, menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
if(headerMenu!=null) {
MenuItem backItem = headerMenu.findItem(R.id.action_back);
MenuItem forwardItem = headerMenu.findItem(R.id.action_forward);
backItem.setEnabled(mainWebView.canGoBack());
forwardItem.setEnabled(mainWebView.canGoForward());
}
if(menu==null) {
return;
}
//MenuItem reloadItem = menu.findItem(R.id.action_reload);
//reloadItem.setVisible(true);
MenuItem saveItem = menu.findItem(R.id.action_add_favorite);
MenuItem deleteItem = menu.findItem(R.id.action_remove_favorite);
switch(urlType) {
case FEED:
if(DDGControlVar.currentFeedObject!=null) {
if(DDGControlVar.currentFeedObject.isSaved()) {
saveItem.setVisible(false);
deleteItem.setVisible(true);
} else {
saveItem.setVisible(true);
deleteItem.setVisible(false);
}
} else {
saveItem.setVisible(false);
deleteItem.setVisible(false);
}
break;
case SERP:
String webViewUrl = mainWebView.getUrl();
if(webViewUrl==null) {
webViewUrl = "";
}
String query = DDGUtils.getQueryIfSerp(webViewUrl);
if(DDGApplication.getDB().isSavedSearch(query)) {
saveItem.setVisible(false);
deleteItem.setVisible(true);
} else {
saveItem.setVisible(true);
deleteItem.setVisible(false);
}
break;
case WEBPAGE:
String url = mainWebView.getUrl();
if(url==null) {
url = "";
}
if(DDGApplication.getDB().isSavedSearch(url)) {
saveItem.setVisible(false);
deleteItem.setVisible(true);
} else {
saveItem.setVisible(true);
deleteItem.setVisible(false);
}
break;
default:
saveItem.setVisible(false);
deleteItem.setVisible(false);
break;
}
webMenu = menu;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
HashMap<Integer, Boolean> newStates;
switch(item.getItemId()) {
case R.id.action_reload:
actionReload();
overflowMenu.dismiss();
return true;
case R.id.action_add_favorite:
actionSave();
return true;
case R.id.action_remove_favorite:
actionDelete();
return true;
case R.id.action_share:
actionShare();
return true;
case R.id.action_external:
actionExternalBrowser();
return true;
case R.id.action_back:
mainWebView.backPressAction(false);
newStates = new HashMap<Integer, Boolean>();
newStates.put(R.id.action_back, mainWebView.canGoBack());
newStates.put(R.id.action_forward, mainWebView.canGoForward());
BusProvider.getInstance().post(new WebViewUpdateMenuNavigationEvent(newStates));
return true;
case R.id.action_forward:
mainWebView.forwardPressAction();
newStates = new HashMap<Integer, Boolean>();
newStates.put(R.id.action_back, mainWebView.canGoBack());
newStates.put(R.id.action_forward, mainWebView.canGoForward());
BusProvider.getInstance().post(new WebViewUpdateMenuNavigationEvent(newStates));
return true;/*
case R.id.action_close:
overflowMenu.dismiss();*/
default:
return super.onOptionsItemSelected(item);
}
}
public void init() {
keyboardService = new KeyboardService(getActivity());
mainWebView = (DDGWebView) fragmentView.findViewById(R.id.fragmentMainWebView);
mainWebView.setParentActivity(getActivity());
mainWebView.getSettings().setJavaScriptEnabled(PreferencesManager.getEnableJavascript());
Log.e("javascript_enabled", PreferencesManager.getEnableJavascript()+"");
DDGWebView.recordCookies(PreferencesManager.getRecordCookies());
DDGNetworkConstants.setWebView(mainWebView);
// get default User-Agent string for reuse later
mWebViewDefaultUA = mainWebView.getSettings().getUserAgentString();
mainWebView.setWebViewClient(new DDGWebViewClient(getActivity(), this));
View hideContent = getActivity().findViewById(R.id.main_container);
ViewGroup showContent = (ViewGroup) getActivity().findViewById(R.id.fullscreen_video_container);
mainWebView.setWebChromeClient(new DDGWebChromeClient(getActivity(), hideContent, showContent));
contentDownloader = new ContentDownloader(getActivity());
mainWebView.setDownloadListener(new DownloadListener() {
public void onDownloadStart(String url, String userAgent,
String contentDisposition, String mimetype,
long contentLength) {
contentDownloader.downloadContent(url, mimetype);
}
});
//temporary fix until next appcompat release
//https://code.google.com/p/android/issues/detail?id=80434
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB && Build.VERSION.SDK_INT <= Build.VERSION_CODES.HONEYCOMB_MR2) {
mainWebView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return true;
}
});
mainWebView.setLongClickable(false);
}
webMenu = new MenuBuilder(getActivity());
getActivity().getMenuInflater().inflate(R.menu.feed, webMenu);
headerMenu = new MenuBuilder(getActivity());
getActivity().getMenuInflater().inflate(R.menu.web_navigation, headerMenu);
mainMenu = new MenuBuilder(getActivity());
getActivity().getMenuInflater().inflate(R.menu.main, mainMenu);
Bundle args = getArguments();
if(args!=null) {
String url = null;
if(args.containsKey(URL)) url = args.getString(URL);
SESSIONTYPE sessionType = SESSIONTYPE.SESSION_BROWSE;
if(args.containsKey(SESSION_TYPE)) sessionType = SESSIONTYPE.getByCode(args.getInt(SESSION_TYPE));
if(url!=null) {
searchOrGoToUrl(url, sessionType);
}
}
}
public boolean getSavedState() {
return savedState;
}
public void searchOrGoToUrl(String text) {
searchOrGoToUrl(text, SESSIONTYPE.SESSION_BROWSE);
}
public void searchOrGoToUrl(String text, SESSIONTYPE sessionType) {
DDGControlVar.mCleanSearchBar = false;
savedState = false;
DDGControlVar.mDuckDuckGoContainer.sessionType = sessionType;
if(DDGControlVar.mDuckDuckGoContainer.sessionType == SESSIONTYPE.SESSION_FEED) {
showFeed(DDGControlVar.currentFeedObject);
return;
}
if (text!=null && text.length() > 0) {
java.net.URL searchAsUrl = null;
String modifiedText = null;
try {
searchAsUrl = new URL(text);
searchAsUrl.toURI();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
searchAsUrl = null;
}
if (searchAsUrl == null && !DDGUtils.isValidIpAddress(text)) {
modifiedText = "http://" + text;
try {
searchAsUrl = new URL(modifiedText);
searchAsUrl.toURI();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
searchAsUrl = null;
}
}
//We use the . check to determine if this is a single word or not...
//if it doesn't contain a . plus domain (2 more characters) it won't be a URL, even if it's valid, like http://test
if (searchAsUrl != null) {
if (modifiedText != null) {
//Show the modified url text
if (modifiedText.contains(".") && modifiedText.length() > (modifiedText.indexOf(".") + 2)) {
showWebUrl(modifiedText);
} else {
searchWebTerm(text);
}
} else {
if (text.contains(".") && text.length() > (text.indexOf(".") + 2)) {
//Show the url text
showWebUrl(text);
} else {
searchWebTerm(text);
}
}
} else {
searchWebTerm(text);
}
}
}
public void searchWebTerm(String term) {
DDGControlVar.mDuckDuckGoContainer.sessionType = SESSIONTYPE.SESSION_SEARCH;
DDGApplication.getDB().insertRecentSearch(term);
//DDGControlVar.mDuckDuckGoContainer.historyAdapter.sync();
if(DDGControlVar.useExternalBrowser == DDGConstants.ALWAYS_EXTERNAL) {
DDGUtils.searchExternal(context, term);
return;
}
urlType = URLTYPE.SERP;
if(!savedState){
String baseUrl;
if(DDGControlVar.regionString.equals("wt-wt")){ // default
if(PreferencesManager.getEnableJavascript()) {
baseUrl = DDGConstants.SEARCH_URL;
} else {
baseUrl = DDGConstants.SEARCH_URL_JAVASCRIPT_DISABLED;
}
mainWebView.loadUrl(baseUrl + URLEncoder.encode(term));
}
else {
if(PreferencesManager.getEnableJavascript()) {
baseUrl = DDGConstants.SEARCH_URL;
} else {
baseUrl = DDGConstants.SEARCH_URL_JAVASCRIPT_DISABLED;
}
mainWebView.loadUrl(baseUrl + URLEncoder.encode(term) + "&kl=" + URLEncoder.encode(DDGControlVar.regionString));
}
}
}
public void showHistoryObject(HistoryObject historyObject) {
if(historyObject.isWebSearch()) {
searchWebTerm(historyObject.getData());
}
else if(historyObject.isFeedObject()) {
DDGApplication.getDB().insertHistoryObject(historyObject);
//DDGControlVar.mDuckDuckGoContainer.historyAdapter.sync();
String feedId = historyObject.getFeedId();
if(feedId != null) {
BusProvider.getInstance().post(new FeedItemSelectedEvent(feedId));
}
}
else {
DDGApplication.getDB().insertHistoryObject(historyObject);
//DDGControlVar.mDuckDuckGoContainer.historyAdapter.sync();
showWebUrl(historyObject.getUrl());
}
}
public void showWebUrl(String url) {
if(DDGControlVar.useExternalBrowser == DDGConstants.ALWAYS_EXTERNAL) {
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
DDGUtils.execIntentIfSafe(context, browserIntent);
return;
}
if(isStorySessionOrStoryUrl()) {
DDGControlVar.mDuckDuckGoContainer.lastFeedUrl = url;
if(DDGControlVar.currentFeedObject != null) {
urlType = URLTYPE.FEED;
}
} else if(DDGUtils.isSerpUrl(url)) {
urlType = URLTYPE.SERP;
} else {
urlType = URLTYPE.WEBPAGE;
}
if(!savedState) {
mainWebView.setIsReadable(false);
mainWebView.loadUrl(url);
}
}
public void showFeed(FeedObject feedObject) {
Log.e("show_feed", "DDGControlVar.useExternalBrowser == DDGConstants.ALWAYS_INTERNAL: "+(DDGControlVar.useExternalBrowser == DDGConstants.ALWAYS_INTERNAL));
Log.e("show_feed", "PreferencesManager.getReadable(): "+(PreferencesManager.getReadable()));
Log.e("show_feed", "mainWebView != null: "+(mainWebView!=null));
Log.e("show_feed", "!mainWebView.isOriginalRequired(): "+((mainWebView==null)?"null":!mainWebView.isOriginalRequired()));
Log.e("show_feed", "feedObject != null: "+(feedObject!=null));
Log.e("show_feed", "feedObject.getArticleUrl() != null: "+((feedObject!=null)?feedObject.getArticleUrl():"null"));
if(feedObject==null) return;
if(!savedState) {
if(DDGControlVar.useExternalBrowser == DDGConstants.ALWAYS_INTERNAL
&& PreferencesManager.getReadable()
&& !mainWebView.isOriginalRequired()
&& feedObject.getArticleUrl()!=null
&& feedObject.getArticleUrl().length() != 0) {
urlType = URLTYPE.FEED;
if(readableFeedTask!=null) {
readableFeedTask.cancel(true);
readableFeedTask = null;
}
readableFeedTask = new ReadableFeedTask(feedObject);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
readableFeedTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
readableFeedTask.execute();
}
}
else {
showWebUrl(feedObject.getUrl());
}
}
}
private boolean isStorySessionOrStoryUrl() {
String originalUrl = null;
try {
originalUrl = mainWebView.getOriginalUrl();
} catch(NullPointerException e) {
e.printStackTrace();
}
return DDGControlVar.mDuckDuckGoContainer.sessionType == SESSIONTYPE.SESSION_FEED
||
( DDGControlVar.mDuckDuckGoContainer.sessionType == SESSIONTYPE.SESSION_BROWSE
&& originalUrl!=null
&& DDGControlVar.mDuckDuckGoContainer.lastFeedUrl.equals(originalUrl)
);
}
private void handleShareButtonClick() {
// XXX should make Page Options button disabled if the page is not loaded yet
// url = null case
String webViewUrl = mainWebView.getUrl();
if(webViewUrl == null){
webViewUrl = "";
}
// direct displaying after feed item is clicked
// the rest will arrive as SESSION_BROWSE
// so we should save this feed item with target redirected URL
if(isStorySessionOrStoryUrl()) {
DDGControlVar.mDuckDuckGoContainer.lastFeedUrl = webViewUrl;
if(DDGControlVar.currentFeedObject != null) {
new WebViewStoryMenuDialog(context, DDGControlVar.currentFeedObject, mainWebView.isReadable).show();//
}
}
else if(DDGUtils.isSerpUrl(webViewUrl)) {
new WebViewQueryMenuDialog(context, webViewUrl).show();
}
else {
new WebViewWebPageMenuDialog(context, webViewUrl).show();
}
}
private void actionShare() {
String webViewUrl = mainWebView.getUrl();
if(webViewUrl==null) {
webViewUrl = "";
}
switch(urlType) {
case FEED:
if(DDGControlVar.currentFeedObject!=null &&DDGControlVar.currentFeedObject.getTitle()!=null && DDGControlVar.currentFeedObject.getUrl()!=null) {
BusProvider.getInstance().post(new ShareFeedEvent(DDGControlVar.currentFeedObject.getTitle(), DDGControlVar.currentFeedObject.getUrl()));
}
break;
case SERP:
BusProvider.getInstance().post(new ShareSearchEvent(webViewUrl));
break;
case WEBPAGE:
BusProvider.getInstance().post(new ShareWebPageEvent(webViewUrl, webViewUrl));
break;
default:
break;
}
}
private void actionExternalBrowser() {
String webViewUrl = mainWebView.getUrl();
if(webViewUrl==null) {
webViewUrl = "";
}
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(webViewUrl));
DDGUtils.execIntentIfSafe(getActivity(), browserIntent);
}
private void actionReload() {
if(!mainWebView.isReadable)
mainWebView.reload();
else {
if(DDGControlVar.currentFeedObject==null) return;
readableFeedTask = new ReadableFeedTask(DDGControlVar.currentFeedObject);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
readableFeedTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
readableFeedTask.execute();
}
}
}
private void actionSave() {
switch(urlType) {
case FEED:
if(DDGControlVar.currentFeedObject==null) return;
BusProvider.getInstance().post(new SaveStoryEvent(DDGControlVar.currentFeedObject));
break;
case SERP:
String query = mainWebView.getUrl();
if(query==null) return;
BusProvider.getInstance().post(new SaveSearchEvent(DDGUtils.getQueryIfSerp(query)));
break;
case WEBPAGE:
String url = mainWebView.getUrl();
String title = mainWebView.getTitle();
if(url==null || url.equals("")) return;
if(title==null || title.equals("")) title = url;
BusProvider.getInstance().post(new SaveSearchEvent(title, url));
break;
}
}
private void actionDelete() {
switch(urlType) {
case FEED:
if(DDGControlVar.currentFeedObject==null) return;
BusProvider.getInstance().post(new UnSaveStoryEvent(DDGControlVar.currentFeedObject.getId()));
break;
case SERP:
BusProvider.getInstance().post(new UnSaveSearchEvent(DDGUtils.getQueryIfSerp(mainWebView.getUrl())));
break;
case WEBPAGE:
BusProvider.getInstance().post(new UnSaveSearchEvent(mainWebView.getUrl()));
break;
}
if(urlType==URLTYPE.FEED) {
} else if(urlType==URLTYPE.SERP) {
}
}
private void actionTurnReadabilityOff() {
String webViewUrl = mainWebView.getUrl();
mainWebView.forceOriginal();
showWebUrl(webViewUrl);
}
public void setContext(Context context) {
if(this.context==null) {
this.context = context;
}
}
private void actionTurnReadabilityOn() {
if(readableFeedTask!=null) {
readableFeedTask.cancel(true);
readableFeedTask=null;
}
readableFeedTask = new ReadableFeedTask(DDGControlVar.currentFeedObject);
}
private void dismissMenu() {
if(overflowMenu!=null && overflowMenu.isShowing()) {
overflowMenu.dismiss();
}
}
@Subscribe
public void onWebViewClearBrowserStateEvent(WebViewClearBrowserStateEvent event) {
mainWebView.clearBrowserState();
}
@Subscribe
public void onWebViewClearCacheEvent(WebViewClearCacheEvent event) {
mainWebView.clearCache();
}
@Subscribe
public void onWebViewReloadActionEvent(WebViewReloadActionEvent event) {
actionReload();
}
@Subscribe
public void onWebViewBackPressActionEvent(WebViewBackPressActionEvent event) {
mainWebView.backPressAction(true);
}
@Subscribe
public void onTurnReadabilityOffEvent(TurnReadabilityOffEvent event) {
mainWebView.forceOriginal();
showWebUrl(event.url);
}
@Subscribe
public void onTurnReadabilityOnEvent(TurnReadabilityOnEvent event) {
if(readableFeedTask!=null) {
readableFeedTask.cancel(true);
}
readableFeedTask = new ReadableFeedTask(event.feedObject);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
readableFeedTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
readableFeedTask.execute();
}
}
@Subscribe
public void onReadabilityFeedRetrieveSuccessEvent(ReadabilityFeedRetrieveSuccessEvent event) {
if(event.feed.size() != 0) {
DDGControlVar.currentFeedObject = event.feed.get(0);
DDGControlVar.mDuckDuckGoContainer.lastFeedUrl = DDGControlVar.currentFeedObject.getUrl();
mainWebView.readableAction(DDGControlVar.currentFeedObject);
}
}
@Subscribe
public void onWebViewShowHistoryObjectEvent(WebViewShowHistoryObjectEvent event) {
showHistoryObject(event.historyObject);
}
@Subscribe
public void onWebViewSearchOrGoToUrlEvent(WebViewSearchOrGoToUrlEvent event) {
searchOrGoToUrl(event.text, event.sessionType);
}
@Subscribe
public void onWebViewSearchWebTermEvent(WebViewSearchWebTermEvent event) {
searchWebTerm(event.term);
}
@Subscribe
public void onHandleShareButtonClickEvent(HandleShareButtonClickEvent event) {
handleShareButtonClick();
}
@Subscribe
public void onWebViewItemMenuClickEvent(WebViewItemMenuClickEvent event) {
onOptionsItemSelected(event.item);
}
@Subscribe
public void onWebViewOpenMenuEvent(WebViewOpenMenuEvent event) {
if(webMenu!=null) {
onPrepareOptionsMenu(webMenu);
if(overflowMenu!=null && overflowMenu.isShowing()) {
return;
}
overflowMenu = new DDGOverflowMenu(getActivity());
overflowMenu.setHeaderMenu(headerMenu);
overflowMenu.setMenu(webMenu);
overflowMenu.setMenu(mainMenu, true);
overflowMenu.show(event.anchorView);
}
}
@Subscribe
public void onOverflowButtonClickEvent(OverflowButtonClickEvent event) {
if(DDGControlVar.mDuckDuckGoContainer.currentFragmentTag.equals(getTag()) && webMenu!=null) {
if(overflowMenu!=null && overflowMenu.isShowing()) {
return;
}
onPrepareOptionsMenu(webMenu);
overflowMenu = new DDGOverflowMenu(getActivity());
overflowMenu.setHeaderMenu(headerMenu);
overflowMenu.setMenu(webMenu);
overflowMenu.setMenu(mainMenu, true);
overflowMenu.show(event.anchor);
}
}
@Subscribe
public void onWebViewOnPageStarted(WebViewOnPageStarted event) {
if(DDGControlVar.currentFeedObject!=null && DDGControlVar.currentFeedObject.getUrl()!=null
&& DDGControlVar.currentFeedObject.getUrl().equals(event.url)) {
urlType = URLTYPE.FEED;
} else if(DDGUtils.isSerpUrl(event.url)) {
urlType = URLTYPE.SERP;
} else {
urlType = URLTYPE.WEBPAGE;
}
}
@Subscribe
public void onOrbotConnectedEvent(OrbotConnectedEvent event) {
actionReload();
}
}